package com.wusiwei.mapper;

import com.wusiwei.entity.Order;
import com.wusiwei.entity.OrderItem;
import com.wusiwei.vo.OrderStatistics;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 订单数据访问接口
 */
@Mapper
public interface OrderMapper {

    /**
     * 查询所有订单
     *
     * @return 订单列表
     */
    List<Order> selectList(Object param);

    /**
     * 根据ID查询订单
     *
     * @param id 订单ID
     * @return 订单信息
     */
    Order selectById(@Param("id") Long id);

    /**
     * 查询订单明细
     *
     * @param orderId 订单ID
     * @return 订单明细列表
     */
    List<OrderItem> selectOrderItems(@Param("orderId") Long orderId);

    /**
     * 插入订单
     *
     * @param order 订单信息
     * @return 影响行数
     */
    int insert(Order order);

    /**
     * 插入订单明细
     *
     * @param item 订单明细
     * @return 影响行数
     */
    int insertOrderItem(OrderItem item);

    /**
     * 更新订单
     *
     * @param order 订单信息
     * @return 影响行数
     */
    int updateById(Order order);

    /**
     * 删除订单明细
     *
     * @param orderId 订单ID
     * @return 影响行数
     */
    int deleteOrderItems(@Param("orderId") Long orderId);

    /**
     * 更新订单删除标记
     *
     * @param id      订单ID
     * @param deleted 删除标记（0:未删除, 1:已删除）
     * @return 影响行数
     */
    int updateDeleted(@Param("id") Long id, @Param("deleted") int deleted);

    /**
     * 批量更新订单删除标记
     *
     * @param ids     订单ID列表
     * @param deleted 删除标记（0:未删除, 1:已删除）
     * @return 影响行数
     */
    int batchUpdateDeleted(@Param("ids") List<Long> ids, @Param("deleted") int deleted);

    /**
     * 查询订单总数
     *
     * @param params 查询参数
     * @return 订单总数
     */
    long countOrders(Map<String, Object> params);

    /**
     * 查询订单状态统计
     *
     * @return 订单状态统计
     */
    OrderStatistics selectOrderStatusStats();

//    /**
//     * 查询订单用于导出
//     *
//     * @param params 查询参数
//     * @return 订单列表
//     */
//    List<Order> selectOrdersForExport(Map<String, Object> params);

//    /**
//     * 查询订单总金额
//     *
//     * @return 订单总金额
//     */
//    BigDecimal selectTotalOrderAmount();

    /**
     * 根据前缀查询最大订单号
     *
     * @param prefix 订单号前缀
     * @return 匹配前缀的最大订单号
     */
    String selectMaxOrderNumberByPrefix(@Param("prefix") String prefix);

    /**
     * 获取订单总金额
     *
     * @return 订单总金额
     */
    BigDecimal getTotalOrderAmount();

    /**
     * 获取当月订单金额
     *
     * @return 当月订单金额
     */
    BigDecimal getCurrentMonthOrderAmount();

    /**
     * 获取上月订单金额
     *
     * @return 上月订单金额
     */
    BigDecimal getLastMonthOrderAmount();

    /**
     * 统计订单总数
     *
     * @return 订单总数
     */
    int countTotal();

    /**
     * 按状态统计订单
     *
     * @return 状态统计结果
     */
    List<Map<String, Object>> countByStatus();

    /**
     * 按供应商统计订单
     *
     * @return 供应商统计结果
     */
    List<Map<String, Object>> countBySupplier();

    /**
     * 获取订单月度趋势
     *
     * @param months 月数
     * @return 订单趋势数据
     */

    // todo 未完成
    List<Map<String, Object>> getOrderTrendByMonth(@Param("months") int months);

//    /**
//     * 根据条件查询订单
//     *
//     * @param supplierName 供应商名称
//     * @param startDate    开始日期
//     * @param endDate      结束日期
//     * @return 订单列表
//     */
//    List<Order> findByCondition(@Param("supplierName") String supplierName,
//                                @Param("startDate") String startDate,
//                                @Param("endDate") String endDate);

    /**
     * 根据供应商和金额范围查询订单
     *
     * @param supplierName 供应商名称
     * @param minAmount    最小金额
     * @param maxAmount    最大金额
     * @return 符合条件的订单列表
     */
    List<Order> findBySupplierAndAmount(@Param("supplierName") String supplierName,
                                        @Param("minAmount") BigDecimal minAmount,
                                        @Param("maxAmount") BigDecimal maxAmount);

    /**
     * 根据近似供应商名称和金额范围查询订单
     * 使用模糊匹配查询供应商名称相似的订单
     *
     * @param supplierName 供应商名称（将用于模糊匹配）
     * @param minAmount    最小金额
     * @param maxAmount    最大金额
     * @return 符合条件的订单列表
     */
    List<Order> findBySimilarSupplierAndAmount(@Param("supplierName") String supplierName,
                                               @Param("minAmount") BigDecimal minAmount,
                                               @Param("maxAmount") BigDecimal maxAmount);

    /**
     * 获取当月订单数量
     *
     * @return 当月订单数量
     */
    int getCurrentMonthOrderCount();

    /**
     * 获取月度订单趋势
     *
     * @param year 年份
     * @return 月度趋势数据
     */
    List<Map<String, Object>> getMonthlyOrderTrend(@Param("year") Integer year);

//    /**
//     * 获取月度订单金额统计
//     *
//     * @return 月度订单金额统计列表
//     */
//    List<OrderStatistics.MonthlyAmount> selectMonthlyOrderAmounts();

//    /**
//     * 获取订单状态统计数量
//     *
//     * @return 订单状态统计
//     */
//    Map<String, Integer> selectStatusCount();

    /**
     * 统计指定年份的订单数量
     *
     * @param year 年份
     * @return 订单数量
     */
    int countOrdersByYear(Integer year);

    /**
     * 分页查询订单
     *
     * @param params 查询参数
     * @return 订单列表
     */
    List<Order> selectOrderPage(Map<String, Object> params);
} 